package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.dto.DishDto;
import com.itheima.reggie.dto.OrdersDto;
import com.itheima.reggie.entity.*;
import com.itheima.reggie.mapper.OrderMapper;
import com.itheima.reggie.service.AddressBookService;
import com.itheima.reggie.service.OrderDetailService;
import com.itheima.reggie.service.OrderService;
import com.itheima.reggie.service.ShoppingCartService;
import com.itheima.reggie.utils.BaseContext;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
@Transactional
public class OrderServiceImpl  implements OrderService {
    
    @Autowired
    private OrderMapper mapper;
    
    @Autowired
    private AddressBookService addressBookService;
    
    @Autowired
    private ShoppingCartService shoppingCartService;
    
    @Autowired
    private OrderDetailService orderDetailService;
    
    /**
     * 添加订单
     *      1. 提交订单，要往两张表添加数据 ：  订单表(orders) 和 订单详情表(order_detail)
     *      2. 必须先往订单表里面添加记录，然后再往详情表里面添加记录
     *
     * @param orders
     * @return
     */
    @Override
    public int add(Orders orders , User user ) {
        
        //1. 往订单表里面添加数据
        //1.1 先补充orders的数据
        orders.setId(IdWorker.getId());
        //1.1.1 设置number， 数量
        orders.setNumber(orders.getId() +"");
//        orders.setNumber(UUID.randomUUID().toString().replace("-",""));
        //1.1.2 设置订单的状态： 1待付款，2待派送，3已派送，4已完成，5已取消
        orders.setStatus(1);
        //1.1.3 设置用户id
        orders.setUserId(user.getId());
        //1.1.4 设置地址的id  不需要设置，因为页面已经提供了
        //1.1.5 设置提交订单时间
        orders.setOrderTime(LocalDateTime.now());
        //1.1.6 设置付款时间
        orders.setCheckoutTime(LocalDateTime.now());
        //1.1.7 设置付款方式 不需要设置，因为页面已经提供了
        //1.1.8 设置总金额  不需要设置，因为页面已经提供了
        //1.1.9 设置备注 不需要设置，因为页面已经提供了
        //1.1.10 提交订单的用户用户名
        orders.setUserName(user.getName());
    
        AddressBook addressBook = addressBookService.getById(orders.getAddressBookId());
        //1.1.11 收货人的电话
        orders.setPhone(addressBook.getPhone());
        //1.1.12 收货人的地址 = 省份  + 城市 + 地区 + 详细地址
        orders.setAddress(
                ( addressBook.getProvinceName() != null ? addressBook.getProvinceName() : "") +
                ( addressBook.getCityName() != null ? addressBook.getCityName() : "") +
                ( addressBook.getDistrictName() != null ? addressBook.getDistrictName() : "") +
                ( addressBook.getDetail() != null ? addressBook.getDetail() : "")
        );
        //1.1.13 收货人的名字
        orders.setConsignee(addressBook.getConsignee());
        
        //1.2 往订单表添加订单
        int row = mapper.insert(orders);
        
        //2. 往订单详情表添加数据
        //2.1 先从购物车里面拿出来数据
        List<ShoppingCart> cartList = shoppingCartService.list();
        
        
        int row2 = 0 ;
        
        //2.2 遍历购物车的数据，每一条购物车数据就是一个订单详情对象
        for (ShoppingCart cart : cartList) {
            
            //2.3 遍历一次购物车对象，就创建一个订单详情对象
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setId(IdWorker.getId());
    
            //2.4 把购物车条目对象拷贝到订单详情对象身上
            BeanUtils.copyProperties(cart , orderDetail);
            
            //2.5 设置属于哪个订单
            orderDetail.setOrderId(orders.getId());
            
            //2.6 最后把这个订单详情对象，添加到订单详情表即可！
            row2 += orderDetailService.add(orderDetail);
        }
        
        
        //3. 如果订单都已经添加好了，那么就情况购物车
        if(row >0 && row2 == cartList.size() ){
            shoppingCartService.clean();
        }
        
        
        return row >0 && row2 == cartList.size() ? 1 : 0;
    }

    /**
     * 查询订单记录
     * @param param
     */
    @Override
    public Page<OrdersDto> findList(PageParam param) {
        //新建 ordersPage，用于储存分页查询后的结果
        Page<Orders> ordersPage=new Page<>(param.getPage(),param.getPageSize());
        //创建一个查询条件，按照userid 的值查询订单，并且按照下单时间从高到低排序
        LambdaQueryWrapper<Orders> lqw=new LambdaQueryWrapper<>();
        lqw.eq(Orders::getUserId, BaseContext.get()).orderByDesc(Orders::getOrderTime);
        //执行分页查询
        mapper.selectPage(ordersPage,lqw);

        //需要把Page<Orders>包装到Page<OrdersDto>返回
        //复制total属性的值到ordersDtoIPage
        Page<OrdersDto> ordersDtoIPage = new Page<>();
        ordersPage.setTotal(ordersPage.getTotal());

        //复制ordersPage的Records属性的值到ordersDtoIPage
        //遍历循环ordersPage.getRecords()，得到每一个orders属性，包装成ordersDto，返回包装到List<OrdersDto>
        List<OrdersDto> dtoList =  ordersPage.getRecords().stream().map(orders -> {
            OrdersDto dto = new OrdersDto();

            BeanUtils.copyProperties(orders, dto);

            dto.setOrderDetails(orderDetailService.findByOrderId(orders.getId()));

            return dto;

        }).collect(Collectors.toList());
        //把List<OrdersDto>添加到ordersDtoIPage.Records属性；
        ordersDtoIPage.setRecords(dtoList);
        //返回ordersDtoIPage
        return ordersDtoIPage;

    }
}
